/**
	This file is part of MemoryTrace.

	MemoryTrace is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

    Contributed by Ameziane NAIT ABDELAZIZ and Bruno LATHUILIERE at EDF R&D 
	SINECTICS I23 Clamart.
        
	MemoryTrace is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with MemoryTrace.  If not, see <http://www.gnu.org/licenses/>.
**/



/*! \file log-malloc-cpp.h
  \brief Une bibliotheque generique d'interception des appels d'allocations evoluée; 
 *permet la prise en charge de loggeur.
*/

#ifndef __LOG_MALLOC__HH
#define __LOG_MALLOC__HH
#include "alloc_stats.h"
#include <stdlib.h>

	
#ifdef WITH_PTHREADS
#include <pthread.h>
  
/**
 *\brief Mutex pour serialiser les acces aux fichier de log.  
 */

static pthread_mutex_t loglock    = PTHREAD_MUTEX_INITIALIZER;


/**/
#  define LOCK                    (pthread_mutex_lock(&loglock));
#  define UNLOCK                  (pthread_mutex_unlock(&loglock));
#else
#  define LOCK ;
#  define UNLOCK ;
#endif






/**
 *\brief Une structure de donnees regroupant des pointeurs.
 *Structure de donnees regroupant les pointeurs vers les 
 *fonctiond d'allocation
 */
typedef struct 
{
  /**
   *pointeur vers malloc
   */
  void *(*real_malloc) (size_t size) ;
  
  /**
   *pointeur vers free
   */
  void (*real_free) (void *ptr) ;
  
  /**
   *pointeur vers calloc
   */
  void *(*real_calloc) (size_t nmemb, size_t size) ;
  
  
  /**
   *pointeur vers realloc
   */
  void *(*real_realloc)(void* ptr,size_t size);  
}log_malloc_handle;


/*------------------------------------------------------------------------------------------*/
/**
 *quantifie la quantite de memoire utile consommee par le tas (ne compte pas la fragmentation)
 */
unsigned long int memory_allocation=0;

/**
 *compte le nombre d'appel à la fonction malloc.
 */
unsigned long int compteur_malloc=0;
  
/**
 *compte le nombre d'appel à la fonction calloc.
 */
unsigned long int compteur_calloc=0;

/**
 *compte le nombre d'appel à la fonction free.
 */
unsigned long int compteur_free=0;

/**
 *compte le nombre d'appel à la fonction realloc
 */
unsigned long int compteur_realloc=0;

/**
 *compte le nombre de realloc fait sur place
 */
unsigned long int compteur_realloc_ip=0;

/**
 *compte le nombre de realloc avec deplacement
 */
unsigned long int compteur_realloc_dec=0;

/**
 *compteur en terme d'evenement d'allocation
 */
static unsigned long int malloc_events=0;
/*-----------------------------------------------------------------------------------------*/

/**
 *flag mode log actif ou pas
 */
static unsigned int initLog=0;
/*-----------------------------------------------------------------------------------------*/

/**
 *Liste des macros utilisées  
 */
#ifndef REGION_MACROS
#define REGION_MACROS
/**
 *Active le mode log
 */
#  define MAC_ACTIVATE_LOG()    initLog=1



/**
 *Desactive le mode log
 */
#  define MAC_DESACTIVATE_LOG() initLog=0

/**
 *Indique si le mode log est activé
 */
#  define MAC_LOG_ACTIVATED()   (initLog!=0)


#endif

/**
 *\brief redefinition du malloc.
 */
//void *malloc(size_t size);



/**
 *\brief redefinition du calloc.
 */
//void *calloc(size_t nmemb, size_t size);



/**
 *\brief redefinition du free.
 */
//void free(void *ptr);


/**
 *\brief redefinition du realloc
 */
//void* realloc(void* ptr,size_t size);

/**
 *\brief renvoie une structure contenant
 *\seeAlso alloc_stats.h
 */
alloc_stats MEMORY_TRACE_GetMemorySummary();
#endif

